松本行弘的程序世界 6 Ruby On Rails
MVC和Ruby On Rails
MVC是设计GUI程序的设计模式之一。大部分设计模式仅决定程序某一部分的构成,而MVC决定了应用程序的整体部分,有时候也被成为架构模式。
模型、视图和控制的作用
模型:是表现窗口中表示内容(信息)的对象。模型代表的只是信息(名字、数值等抽象的信息),它不能包含如何来显示这些信息的信息。
视图:代表将模型中包含的信息在窗口中进行表示的对象。视图知道要表现的模型的信息,而模型一般不知道要表示自己的视图信息。
控制:是从用户端接受输入,对视图和模型进行操作的对象。
用秒表的例子来学习MVC模式
生成视图和控制部分
GUI工具箱与MVC
同时使用工具箱和MVC
MVC的优缺点
优点:
可以更换界面
一个模型对应多个视图
多个视图可以同时响应
容易测试
缺点:
复杂性
强关联性
对模型对象进行了功能追加这样的变更后,相应地也必须对视图和控制进行变更。
Web应用中的MVC
Web应用基本是HTTP。HTTP的一次处理经过了一下过程:
(1)Web浏览器对应于用户的操作,向Web服务器发出HTTP请求。
(2)Web服务器根据请求,准备好发送到Web浏览器的数据。
(3)Web服务器把数据以HTTP响应的形式送还Web浏览器。
利用MVC来描述:
(1)Web浏览器发送过来的HTTP请求通过Web服务器传给控制部分。Web应用框架的分配器把请求传递给合适的控制部分。
(2)控制部分操作的模型和请求的信息相对应,同时制定显示使用的视图。视图从模型启动,一边引用模型一边准备发送给Web浏览器的数据。
(3)Web服务器把数据以HTTP响应的形式送还Web浏览器。
Ruby on Rails上的MVC各部分功能稍有不同。Rails中的模型相当于数据库层,视图指显示用的模板,控制器指控制用的类(包含了应用逻辑)。
开放类和猴子补丁
猴子补丁,即在动态语言中,不改变源代码而对功能进行追加和变更。
现在灵活使用开放类,变更和追加方法全部称为猴子补丁。
开放类
Ruby的类的特征是所谓的开放类,相对于其他语言,特别容易打猴子补丁。
Ruby中,可以把String类、Array类等基本的数据类型及所有的类都作为开放类处理,可以自由地追加功能。
猴子补丁的目的
功能追加
利用开放类可以给已有的类追加功能。
功能变更
修改程序错误
因为重新定义了有程序错误或有副作用的方法,不用修改原来那部分的代码就可以解决问题。这也是本来的猴子补丁的目的。
钩子
有时间想在每个方法调用的同时增加一些其他处理。这种伴随方法调用而进行的处理称为“钩子”(hook),钩子的追加也可以用猴子补丁来实现。
缓存(cache)
猴子补丁的技巧
可以吧Ruby提供的对方法、类和模块进行操作的功能运用到打猴子补丁上。最基本的功能就是给已有的方法改名或取消。
undef
undef有把方法取消定义的功能。用undef不仅可以取消本类中的方法,也可以取消父类中定义的方法。
alias
include
灵活使用开放类的库
jcode库可以不使用正则表达式,利用开放类的功能,使得字符串的方法可以处理多字节文字。
猴子补丁的几点问题
若要正确使用开放类,安全地打猴子补丁,需遵守:
- 基本上只是追加功能
对类追加新方法不会让已有的程序无法执行。使用开放类时,主要做不容易导致问题的功能追加会更保险。做功能追加时,如果发生名称重复会造成麻烦,在选择追加的方法名时需要慎重。 - 进行功能变更时要慎重,尽可能小规模
- 小心相互作用
其他方法
猴子补丁能够不改变源代码进行动态修改,这种灵活性是显示动态语言柔软性和扩展性的好例子。实现猴子补丁的Ruby开放类有时功能过强,可能会引起问题。
其他语言中用更易控制的形式也能实现猴子补丁。
Ruby on Rails和开放类
Rails构成部分之一ActiveSupport库。ActiveSupport利用Ruby的开放类功能,对Ruby标准提供的类大胆地追加了功能。
ActiveSupport带来的扩展
- 时间
- 字节单位系列
- 复数形和序数
大规模开发和Ruby
编译时不作类型检查
Ruby在执行时作类型检查,大规模程序为了保证可靠性一定会有严格的测试程序,如果作了严格的测试,在编译时作类型检查的优点就不像所说的那么重要了。
没有包
Java对于构成库的类和文件有独立的包,要想具备某种功能,必须明确地进行import操作。而Ruby是不具备这种功能的。所以,库定义的类和模块名是全局的,从任何地方都可以引用。因此,可以说名称重复的危险性很大。
存在开放类
各自独立的库发生互相矛盾的变更时,问题不能简单解决。这也可能在大规模开发时引发问题。
信赖性模型
在某种类型的大规模开发中,Ruby的性质会造成问题,或者说造成问题时解决起来不像其他语言那么容易,这种现象是现实中可能存在的。如果认为这些是问题的话,可能不使用Ruby会更好。但是,到现在为止我们看到的情况表明,会发生那种问题的大规模开发本来就绝不是好的开发状况。首先要做的,是把项目的信赖关系改善到可以使用Ruby的程度。就算是最后也没有使用Ruby,这也是应该先做到的事情。
猴子补丁的未来
猴子补丁虽然有一定的危险性,但有利有弊,它也提供了方便性、扩展性和灵活性。开放类和利用它的猴子补丁,将来也可能会被更安全的、由1特定目的而特制的功能群而替代。